#include <iostream>
#include <vector>
#include <unistd.h>
#include <signal.h>

// #define BLOCK_SIGNAL 2
#define MAX_SIGNUM 31

using namespace std;

// void handler(int signo)
// {
//     std::cout << "进程捕捉到了一个信号，信号编号是：" << signo << std::endl;
// }

// int main()
// {
//     signal(2, handler);

//     while(true)
//     {
//         std::cout << "我是一个进程：" << getpid() << std::endl;
//         sleep(1);
//     }
// }

static vector<int> sigarr = {2};

static void show_pending(sigset_t &pending)
{
    for (int signo = MAX_SIGNUM; signo >= 1; signo--)
    {
        if (sigismember(&pending, signo))
        {
            cout << "1";
        }
        else
            cout << "0";
    }
    cout << "\n";
}

static void myhandler(int signo)
{  
    cout << signo << " 号信号已经被递达！！" << endl;
}

int main()
{
    for (const auto &sig : sigarr) signal(sig, myhandler);

    // 1、尝试屏蔽指定信号
    sigset_t block, oblock, pending;
    // 1.1、初始化
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigemptyset(&pending);
    // 1.2、添加要屏蔽的信号
    for (const auto &sig : sigarr)
        sigaddset(&block, sig);
    // 1.3、开始屏蔽，设置进内核
    sigprocmask(SIG_SETMASK, &block, &oblock);

    // 2、遍历打印pending信号集
    int cnt = 10;
    while (true)
    {
        // 2.1、初始化
        sigemptyset(&pending);
        // 2.2、获取
        sigpending(&pending);
        // 2.3、打印
        show_pending(pending);
        // 3、减慢速度
        sleep(1);
        if(cnt-- == 0)
        {
            sigprocmask(SIG_SETMASK, &oblock, &block);
            cout << "恢复对信号的屏蔽，不屏蔽任何信号";
        }
    }
    return 0;
}